home *** CD-ROM | disk | FTP | other *** search
- /*
- IC Document.c
-
- */
-
- #include <Aliases.h>
- #include <Folders.h>
- #include <MixedMode.h>
-
- #include "IC Types.h"
- #include "IC StrH.h"
- #include "IC API.h"
- #include "IC Keys.h"
- #include "IC Globals.h"
- #include "IC Misc Subs.h"
- #include "IC Subs.h"
- #include "IC Dialogs.h"
- #include "IC Window Globals.h"
- #include "IC Windows.h"
- #include "IC StandardFile.h"
-
- #include "IC Document.h"
-
- ICInstance instance;
- FSSpec current_file;
- long current_seed;
- FSSpec scratch_file; // open if name is not empty
- Boolean new_document,dirty_document,locked_document;
-
- OSErr CopyFileSafe(FSSpec* source,FSSpec* dest){
- FSSpec temp;
- OSErr err;
- short count;
- Str31 st;
-
- BlockMoveData(dest,&temp,sizeof(FSSpec));
- count=0;
-
- do {
- SetPString(temp.name,2,"\pInternet Config Temp ",DecStr(count++,st));
- err=HCreate(temp.vRefNum,temp.parID,temp.name,ICcreator,ICfiletype);
- } while (err==dupFNErr);
- if (err==noErr){
- err=CopyFile(source,&temp);
- if (err==noErr){
- HDelete(dest->vRefNum,dest->parID,dest->name);
- err=HRename(dest->vRefNum,dest->parID,temp.name,dest->name);
- }
- }
- return err;
- }
-
- ICInstance GetInstance(void){
- return instance;
- }
-
- Boolean IsDocOpen(void){
- return (scratch_file.name[0]>0);
- }
-
- Boolean IsDocDirty(void){
- return IsDocOpen()&&dirty_document;
- }
-
- Boolean IsDocNew(void){
- return IsDocOpen()&&new_document;
- }
-
- void DirtyDocument(void){
- dirty_document=true;
- }
-
- Boolean IsDocLocked(void){
- return IsDocOpen()&&locked_document;
- }
-
- StringPtr GetDocumentName(StringPtr name){
- if (current_file.name[0]==0)
- return GetAString(name,128,1);
- else
- return SetPString(name,1,current_file.name);
- }
-
- Boolean PrefExists(const StringPtr key){
- ICAttr attr;
- long count;
-
- return ICMapErr(ICGetPref(instance,key,&attr,(Ptr)0,&count))==noErr;
- }
-
- void SetPrefHandle(const StringPtr key,Handle h){
- if (!PrefExists(key))
- ICSetPrefHandle(instance,key,ICattr_no_change,h);
- }
-
- void SetPrefStr(const StringPtr key,const StringPtr data){
- if (!PrefExists(key))
- ICSetPrefStr(instance,key,ICattr_no_change,data);
- }
-
- void CheckServerPref(const StringPtr key){
- Handle tmph;
- OSErr err;
- ICAttr junk;
- Str255 t,t2;
-
- if (!PrefExists((const StringPtr)SetPString(t,2,key,"\pPreferred"))){
- err=ICMapErr(ICGetPrefHandle(instance,(const StringPtr)SetPString(t,2,key,"\pAll"),&junk,&tmph));
- if ((err==noErr)&&(tmph!=(Handle)0)&&(GetHandleSize(tmph)>2))
- SetPrefStr((const StringPtr)SetPString(t,2,key,"\pPreferred"),
- (const StringPtr)GetIndStrH(tmph,1,t2));
- if (tmph!=(Handle)0)
- DisposeHandle(tmph);
- }
- }
-
- void AddDefaultPrefs(void){
- short i,c;
- Handle data;
- short junk_id;
- ResType junk_type;
- Str255 name;
-
- UseResFile(app_resfile);
- c=Count1Resources('Pref');
-
- for (i=1;i<=c;i++){
- data=Get1IndResource('Pref',i);
- if (data!=(Handle)0){
- GetResInfo(data,&junk_id,&junk_type,name);
- SetPrefHandle(name,data);
- ReleaseResource(data);
- }
- }
-
- CheckServerPref("\pArchie");
- CheckServerPref("\pInfoMac");
- CheckServerPref("\pUMich");
-
- SetPrefStr(kICRealName,GetOwnerName(name));
- }
-
- OSErr CreateScratchFile(FSSpec* protofile){
- OSErr err;
- short count;
- Str255 t;
-
- err=FindFolder(kOnSystemDisk,kTemporaryFolderType,kCreateFolder,&scratch_file.vRefNum,&scratch_file.parID);
- if (err==noErr){
- // scratch_file.parID=2
- count=0;
-
- do {
- SetPString(scratch_file.name,2,"\pInternet Config Temp ",DecStr(count++,t));
- err=HCreate(scratch_file.vRefNum,scratch_file.parID,scratch_file.name,ICcreator,ICfiletype);
- } while (err==dupFNErr);
- }
-
- if (err==noErr){
- if (protofile!=(FSSpec*)0){
- err=CopyFile(protofile,&scratch_file);
- if (err==noErr)
- err=HRstFLock(scratch_file.vRefNum,scratch_file.parID,scratch_file.name);
- }
- }
-
- if (err==noErr)
- err=ICMapErr(ICSpecifyConfigFile(instance,&scratch_file));
-
- if (protofile==(FSSpec*)0){
- if (err==noErr){
- err=ICMapErr(ICBegin(instance,icReadWritePerm));
- if (err==noErr){
- AddDefaultPrefs();
- err=ICMapErr(ICEnd(instance));
- }
- }
- }
-
- return err;
- }
-
- OSErr DoCloseDoc(void){
- short but;
- OSErr err;
- Str255 ts;
-
- err=WindowsCloseAll();
- if ((err==noErr)&&(IsDocDirty())){
- ParamText(GetDocumentName(ts),"\p","\p","\p");
- InitCursor();
-
- but=CautionAlert(135,gCancelDiscardModalFilter);
-
- switch (but){
- case ok:
- err=DoSave();
- break;
- case cancel:
- err=userCanceledErr;
- break;
- }
- }
-
- if (err==noErr)
- err=WindowsClose(WindowInfo[WT_Main].window);
-
- if (err==noErr){
- if (scratch_file.name[0]!=0){
- HDelete(scratch_file.vRefNum,scratch_file.parID,scratch_file.name);
- scratch_file.name[0]=0;
- }
- }
-
- return err;
- }
-
- OSErr DoCloseDocWindow(WindowPtr wp){
- WindowType wt=GetWindowType(wp);
- OSErr err=noErr;
-
- switch (wt){
- case WT_About:
- HideWindow(wp);
- break;
- case WT_Main:
- err=DoCloseDoc();
- break;
- default:
- err=WindowsClose(wp);
- break;
- }
-
- return err;
- }
-
- OSErr DoNewDoc(void){
- OSErr err;
- Str255 str;
-
- err=DoCloseDoc();
- if (err==noErr){
- WindowsResetPositions();
- new_document=true;
- dirty_document=false;
- locked_document=false;
-
- err=CreateScratchFile((FSSpec*)0);
-
- if (err==noErr)
- WindowsOpen(WT_Main);
- if (err==noErr){
- WindowsSetTitle(WT_Main,GetAString(str,128,1));
- current_file.name[0]=0;
- }
- }
- return err;
- }
-
- void CurrentSeed(long* seed){
- OSErr err;
-
- *seed=0L;
- if (current_file.name[0]!=0){
- err=ICMapErr(ICSpecifyConfigFile(instance,¤t_file));
- if (err==noErr)
- err=ICMapErr(ICGetSeed(instance,seed));
- err=ICMapErr(ICSpecifyConfigFile(instance,&scratch_file));
- }
- }
-
- Boolean SameSeed(long seed1,long seed2){
- return ((seed1==seed2)||(seed1==0)||(seed2==0));
- }
-
- OSErr DoOpenDoc(FSSpec* fss){
- OSErr err;
- Str255 ts;
-
- err=DoCloseDoc();
- if (err==noErr){
- new_document=false;
- dirty_document=false;
- locked_document=FileLocked(fss);
-
- err=CreateScratchFile(fss);
-
- if (err==noErr){
- WindowsRestorePositions();
- err=WindowsOpen(WT_Main);
- }
- if (err==noErr){
- WindowsSetTitle(WT_Main,SetPString(ts,1,fss->name));
- BlockMoveData(fss,¤t_file,sizeof(FSSpec));
- }
- CurrentSeed(¤t_seed);
- }
- return err;
- }
-
- OSErr DoQuit(void){
- OSErr err;
-
- err=DoCloseDoc();
- if (err==noErr)
- quitnow=true;
- return err;
- }
-
- OSErr DoSFOpen(void){
- OSErr err;
- FSSpec fss;
- FInfo info;
-
- err=ICStandardGetFile(ICfiletype,&fss,&info);
- if (err==noErr)
- err=DoOpenDoc(&fss);
-
- return err;
- }
-
- OSErr FindInternetPreferences(FSSpec* default_config){
- OSErr err;
- Boolean isfolder,wasalias;
-
- err=FindFolder(kOnSystemDisk,kPreferencesFolderType,kCreateFolder,&default_config->vRefNum,&default_config->parID);
- if (err==noErr)
- err=ICMapErr(ICDefaultFileName(instance,default_config->name));
- if (err==noErr)
- if (Has_AliasMgr)
- err=ResolveAliasFile(default_config,true,&isfolder,&wasalias);
-
- return err;
- }
-
- OSErr EditPreference(StringPtr key,FSSpec* fs,Boolean usefss,Boolean usecurrent){
- OSErr err;
-
- if (!usefss){
- if (usecurrent){
- BlockMoveData(¤t_file,fs,sizeof(FSSpec));
- usecurrent=IsDocOpen();
- }
- if (!usecurrent)
- err=FindInternetPreferences(fs);
- }
- if (err==noErr){
- if ((!IsDocOpen())||(fs->vRefNum!=current_file.vRefNum)||(fs->parID!=current_file.parID)||(IUEqualString(fs->name,current_file.name)!=0))
- err=DoOpenDoc(fs);
- }
- if (err==noErr)
- if (key[0]!=0)
- err=EditCurrentPreference(key);
-
- return err;
- }
-
- OSErr DoOpenInternetPreferences(void){
- FSSpec default_config;
- OSErr err;
-
- // set up the file name
- SetPString(default_config.name,1,kICDefaultFileName);
-
- err=FindInternetPreferences(&default_config);
- if (err==noErr)
- err=DoOpenDoc(&default_config);
- return err;
- }
-
- OSErr InternalDoSave(FSSpec* fss){
- OSErr err=WindowsFlushAll();
- Str255 ts;
-
- if (err==noErr){
- WindowsSavePositions();
- err=CopyFileSafe(&scratch_file,fss);
- }
-
- if (err==noErr){
- WindowsSetTitle(WT_Main,SetPString(ts,1,fss->name));
- new_document=false;
- dirty_document=false;
- BlockMoveData(fss,¤t_file,sizeof(FSSpec));
- }
-
- CurrentSeed(¤t_seed);
-
- return err;
- }
-
- OSErr DoSave(void){
- OSErr err;
- long seed;
- short a;
-
- if (current_file.name[0]==0)
- err=DoSaveAs();
- else {
- CurrentSeed(&seed);
- a=ok;
-
- if (!SameSeed(seed,current_seed))
- a=CautionAlert(160,gCancelModalFilter);
-
- if (a==ok)
- err=InternalDoSave(¤t_file);
- }
-
- return err;
- }
-
- OSErr DoSaveAs(void){
- OSErr err;
- FSSpec fss;
- Str255 ts;
-
- err=ICStandardPutFile("\p",GetDocumentName(ts),&fss);
- if (err==noErr)
- err=InternalDoSave(&fss);
-
- return err;
- }
-
- OSErr DoOpenApp(void){
- FSSpec default_config;
- OSErr err;
-
- err=FindInternetPreferences(&default_config);
- if (err==noErr)
- err=DoOpenDoc(&default_config);
- if (err==fnfErr){
- err=DoNewDoc();
- if (err==noErr)
- err=InternalDoSave(&default_config);
- }
- return err;
- }
-
- OSErr InitICDocument(void){
- ICInstance inst;
- OSErr err;
-
- instance=(ICInstance)0;
- current_file.name[0]=0;
- scratch_file.name[0]=0;
-
- /*
- The following function will disable the component interface, forcing the
- application to use the linked-in IC glue. In the final application, this should
- be removed, but for debugging purposes it ensures that we will be able to
- debug everything the app is doing.
- */
- // ICDisableComponent();
- ICEnableComponent();
-
- err=ICMapErr(ICStart(&inst,ICcreator));
- if (err==noErr)
- instance=inst;
- return err;
- }
-
- void TermICDocument(void){
- if (instance!=(ICInstance)0)
- ICStop(instance);
- }
-
-
-
-
-
-
-